﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace TD.bom
{
    /// <summary>
    /// Représente une position sur la carte
    /// </summary>
    public class MapObjectPosition
    {
        public int X, Y, Z;

        /// <summary>
        /// Construit une position à l'origine
        /// </summary>
        public MapObjectPosition()
        {
            X = Y = Z = 0;
        }

        /// <summary>
        /// Construit une position aux coordonnées spécifiées
        /// </summary>
        /// <param name="p_x">X</param>
        /// <param name="p_y">Y</param>
        /// <param name="p_z">Z</param>
        public MapObjectPosition(int p_x, int p_y, int p_z)
        {
            X = p_x;
            Y = p_y;
            Z = p_z;
        }

        /// <summary>
        /// Construit par copie
        /// </summary>
        public MapObjectPosition(MapObjectPosition p_source)
        {
            X = p_source.X;
            Y = p_source.Y;
            Z = p_source.Z;
        }

        /// <summary>
        /// Met à jour la position aux coordonnées spécifiées
        /// </summary>
        /// <param name="p_x">X</param>
        /// <param name="p_y">Y</param>
        /// <param name="p_z">Z</param>
        public void Set(int p_x, int p_y, int p_z)
        {
            X = p_x;
            Y = p_y;
            Z = p_z;
        }

        /// <summary>
        /// Obtient la distance entre la projection sur Z de ce point et de celle du point spécifié
        /// (i.e. distance en tenant compte uniquement de X et Y)
        /// </summary>
        /// <param name="p_point">Point par rapport auquel calculer la distance</param>
        /// <returns>distance obtenue</returns>
        public double GetDistanceXYFrom(MapObjectPosition p_point)
        {
            return Math.Sqrt((p_point.X - X) * (p_point.X - X) + (p_point.Y - Y) * (p_point.Y - Y));
        }

        /// <summary>
        /// Pareil que GetDistanceXYFrom mais au carré pour des raison de performance
        /// </summary>
        /// <param name="p_point">Point par rapport auquel calculer la distance</param>
        /// <returns>distance au carré obtenue</returns>
        public double GetSquaredDistanceXYFrom(MapObjectPosition p_point)
        {
            return (p_point.X - X) * (p_point.X - X) + (p_point.Y - Y) * (p_point.Y - Y);
        }

        /// <summary>
        /// Obtient la distance entre la projection sur Z de ce point et le point spécifié
        /// (i.e. distance en tenant compte uniquement de X et Y)
        /// </summary>
        /// <param name="p_point">Point par rapport auquel calculer la distance</param>
        /// <returns>distance obtenue</returns>
        public double GetDistanceXYFrom(Point p_point)
        {
            return Math.Sqrt((p_point.X - X) * (p_point.X - X) + (p_point.Y - Y) * (p_point.Y - Y));
        }
    }
}
